#include <string.h>
#include "ctl_car_msg.h"
#include "../thirdparty/cJSON/cJSON.h"
#include "../config.h"
//{"user":1,"device_number":DEVICE_ALL_WHEELS,"cmd":TURN_LEFT}

static char* CTL_CAR_MSG = "{\"user\":%d,\"cmd\":%d,\"speed\":%d}";



ctl_car_msg* create_ctl_car_msg(char msgtype,int user_id,int cmd,int speed)
{
	int i = 0;
	ctl_car_msg * msg = (ctl_car_msg*) robot_malloc(sizeof(ctl_car_msg),true);
	if(!cmd)
	{
		dbg_info("create_ctl_car_msg:error param");
		return NULL;
	}
    msg->msg_ = robot_malloc(sizeof(msg_base),true);
	msg->msg_->data = robot_malloc(MSG_MAX_LEN*sizeof(char),true);
	msg->msg_->type = msgtype;
	msg->user_id = user_id;
	msg->cmd =  cmd;
	msg->speed = speed;
	
	return msg;
}

int distory_ctl_car_msg(ctl_car_msg * msg)
{
	if(!msg)
	{
		dbg_info("distory_ctl_car_msg:error param");
		return MSG_ERROR_NULL_MSG;
	}
	if(msg->msg_) {
 		if(msg->msg_->data){
			free(msg->msg_->data);
			msg->msg_->data = NULL;
		}
		free(msg->msg_);
		msg->msg_ = NULL;
	}
	
	free(msg);
	return 0;
}

int serialize_ctlcar_msg(ctl_car_msg* msg,char** out_msg,int* out_len)
{
	char* data;
	int i = 0,ret = 0;
	if(!msg){
		dbg_info("serialize_ctlcar_msg:null msg");
		return MSG_ERROR_NULL_MSG;
	}
	if(!msg->msg_){
                dbg_info("serialize_ctlcar_msg: msg base");
                return MSG_ERROR_NULL_MSG;
	}
	data = msg->msg_->data;


	msg->msg_->len = sprintf(data,CTL_CAR_MSG,msg->user_id,msg->cmd,msg->speed);
	dbg_info("serialize_ctlcar_msg_0:%s,len:%d",data,msg->msg_->len);
	
	ret =  serialize_msg(msg->msg_ , out_msg , out_len);
	return ret;
}

/*

*/
int deserialize_ctlcar_msg(char * msg,int len,ctl_car_msg** out_msg)
{
	int ret = 0,i = 0;
	cJSON *jsonroot;
	if(!msg||len<=0){
		dbg_info("deserialize_ctlcar_msg:null msg");
		return MSG_ERROR_NULL_MSG;
	}
	ctl_car_msg* car_msg = (ctl_car_msg*)robot_malloc(sizeof(ctl_car_msg),true);
	ret = deserialize_msg(msg,len,&(car_msg->msg_));
	if(ret){
		dbg_info("deserialize_ctlcar_msg=>deserialize_msg error ret:%d",ret);
		return ret;
	}
	jsonroot = cJSON_Parse(car_msg->msg_->data); 
	car_msg->user_id = cJSON_GetObjectItem(jsonroot,"user")->valueint;
	car_msg->cmd = cJSON_GetObjectItem(jsonroot,"cmd")->valueint;
	car_msg->speed = cJSON_GetObjectItem(jsonroot,"speed")->valueint;
	
	
	if(jsonroot)
		cJSON_Delete(jsonroot);
	*out_msg = car_msg;
	return 0;
}
